package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年05月28日
 * @description ：
 *    套餐业务控制层
 * @version: 1.0
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {
   @Autowired
    private SetmealService setmealService;

   @Autowired
   private CategoryService categoryService;
    /**
     * 添加 套餐
     *   setmeal无法接收 json中
     *        setmealDishes  套餐中的菜品信息
     *   只能借助于 写 dto类
     *   SetmealDto
     *      必须包含 接收多个 菜品关联信息的  内容
     *
     */
    @PostMapping
    @CacheEvict(value = "sermealCache",allEntries = true)
    public R<String> save(@RequestBody SetmealDto setmealDto){
       log.info("[添加的套餐信息:],setmealDto:{}",setmealDto);
        // 这个 setmealDto里面包含什么?
        //      套餐基本信息 ,以及 该套餐相关的 菜品关联信息
        // setmealDto  =  setmeal + 与菜品的关联信息 份数 价格
        // 涉及的存储内容是一张表吗?
        //   两张表  setmeal  + setmealDish
        // 自己定义service方法

           setmealService.saveWithDish(setmealDto);//保存套餐以及 与菜品关联内容
            return R.success("保存套餐成功");

    }

    /***
     *  根据 page 当前页码 pageSize 每页显示条数
     *     name 条件 进行分页查询
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){
        // 构建分页构造器
        Page<Setmeal> pageInfo = new Page<>(page,pageSize);
        //构建条件构造器
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
        //有什么条件?
        // 根据name模糊查询
        wrapper.like(StringUtils.isNotEmpty(name),Setmeal::getName,name);
        //如果想排序就排序
        wrapper.orderByDesc(Setmeal::getUpdateTime);
        //运行
        setmealService.page(pageInfo,wrapper);

        //  pageInfo 的 records 数据 是 setmeal信息 没有 分类名字
        // 构建一个新的分页对象  除了 records 数据 其他数据都要
        //   records 数据 变成 List<SetmealDto>
        //创建一个 用于返回 分页数据的 新分页对象
        Page<SetmealDto> dtoPage = new Page<>();
        //  里面没数据
        // 怎么完成属性的复制呢
        BeanUtils.copyProperties(pageInfo,dtoPage,"records");
        //运行到这里  dtoPage 除了 哪个当前页数据 其他数据都有值了
        List<SetmealDto> records = new ArrayList<>();
        // 这个records 要填什么数据
        // 是不是 每个SetmealDto都先包含基本的套餐数据+ 所属套餐分类
        // 每个SetmealDto  基本套餐数据在哪里?  pageInfo--records里面
        //遍历    pageInfo--records 拿到每个基本套餐数据
        List<Setmeal> infoRecords = pageInfo.getRecords();
        for (Setmeal setmeal : infoRecords) {
            //  setmeal 套餐基本信息
            // SetmealDto  套餐基本信息+ 所属套餐分类名
            SetmealDto setmealDto = new SetmealDto();
            //怎么复制属性简便呢
            BeanUtils.copyProperties(setmeal,setmealDto);
            //少了套餐分类名
            Category category = categoryService.getById(setmeal.getCategoryId());
            setmealDto.setCategoryName(category.getName());
            // 得到一个  SetmealDto  套餐基本信息+ 所属套餐分类名 存到集合
            records.add(setmealDto);
        }
         //  records 是不是还没放到 dtoPage里面
        dtoPage.setRecords(records);
        return R.success(dtoPage);
    }

    /**
     * 删除套餐
     *    @RequestParam 把地址栏多值收集 集合上
     *               如果参数名不匹配 也可以用它
     */
    @DeleteMapping
    @CacheEvict(value = "sermealCache",key = "#setmeal.categoryId")
    public R<String> delete(@RequestParam List<Long> ids){
        log.info("ids:{}",ids);

       // setmealService.removeByIds(ids);//能不能直接去删?
        // 要不要加业务逻辑

        // 需要自己写删除业务逻辑 --删除套餐的同时 是不是也得删除 套餐关系表
        setmealService.removeByIdsWithDish(ids);

        return R.success("套餐数据删除成功");
    }

    /**
     *   根据套餐分类 查看套餐
     *     接收套餐分类id  和 status  去套餐表里根据套餐分类查询套餐
     */
    /**
     * 根据条件查询套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    @Cacheable(value = "sermealCache",key = "#setmeal.categoryId")
    public R<List<Setmeal>> list(Setmeal setmeal){

        //去redis中 取值  判断......

        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId() != null,Setmeal::getCategoryId,setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus() != null,Setmeal::getStatus,setmeal.getStatus());
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        List<Setmeal> list = setmealService.list(queryWrapper);
        return R.success(list);
    }

}
